package com.bobbygu.libnet.common;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;


/**
 * ProgressResponseBody
 * <p>
 * author: 顾博君 <br>
 * time:   2017/12/1 14:57 <br>
 * e-mail: gubojun@csii.com.cn <br>
 * </p>
 */
public class ProgressResponseBody extends ResponseBody
{

	//实际的待包装响应体
	private final ResponseBody responseBody;
	//进度回调接口
	private final ProgressResponseListener progressListener;
	//包装完成的BufferedSource
	private BufferedSource bufferedSource;

	/**
	 * 构造函数，赋值
	 * @param responseBody 待包装的响应体
	 * @param progressListener 回调接口
	 */
	public ProgressResponseBody(ResponseBody responseBody, ProgressResponseListener progressListener) {
		this.responseBody = responseBody;
		this.progressListener = progressListener;
	}

	@Override
	public MediaType contentType()
	{
		return responseBody.contentType();
	}

	@Override
	public long contentLength()
	{
		return responseBody.contentLength();
	}

	@Override
	public BufferedSource source()
	{
		if (bufferedSource == null) {
			//包装
			bufferedSource = Okio.buffer(source(responseBody.source()));
		}
		return bufferedSource;
	}

	/**
	 * 读取，回调进度接口
	 * @param source Source
	 * @return Source
	 */
	private Source source(Source source) {

		return new ForwardingSource(source) {
			//当前读取字节数
			long totalBytesRead = 0L;
			@Override
			public long read(Buffer sink, long byteCount) throws IOException
			{
				long bytesRead = super.read(sink, byteCount);
				//增加当前读取的字节数，如果读取完成了bytesRead会返回-1
				totalBytesRead += bytesRead != -1 ? bytesRead : 0;
				//回调，如果contentLength()不知道长度，会返回-1
				progressListener.onResponseProgress(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
				return bytesRead;
			}
		};
	}
}
